/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja5;

import java.util.*;
import java.util.LinkedList;

public class Driver {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        int anterior;
        int actual=0;
        int num=0;
        int promedio=0;
        boolean encontrado;
        int temporal1, temporal2, temporal3;
        Fila[] gente=new Fila[4];
        int[] tiempos=new int[4];
        for(int cuatro=0; cuatro<4; cuatro++){
            gente[cuatro]=new Fila();
            tiempos[cuatro]=0;
        }
        Random generator=new Random();
        LinkedList<Evento> eventos=new LinkedList<Evento>();
        LinkedList<Evento> cola1=new LinkedList<Evento>();
        LinkedList<Evento> cola2=new LinkedList<Evento>();
        LinkedList<Evento> cola3=new LinkedList<Evento>();
        LinkedList<Evento> cola4=new LinkedList<Evento>();
        Scanner readln=new Scanner(System.in);
        System.out.print("Bienvenido ingrese los tiempos en los que entran\n");
        System.out.print("los clientes al banco. Al terminar coloque un \n");
        System.out.print("numero menor al anterior, es decir un tiempo invalido \n");
        System.out.print("para iniciar la simulacion con los numeros validos");
        do{
            anterior=actual;
            System.out.println("Ingrese el tiempo en que entra el cliente numero:"+(num+1)+"\n");
            actual=readln.nextInt();
            if(actual>480)
                anterior=actual+1;
            if(anterior<=actual){
               num++;
               eventos.add(new Evento(actual,generator.nextInt(30)+1,0,0, true));
            }       
        }while(anterior<=actual);
        System.out.print("Iniciando simulacion \n");
        Evento eventoactual;
        /*
        System.out.println("Tam: "+eventos.size());
        eventoactual = eventos.remove(0);
        System.out.println("evento: "+eventoactual.gett1());
        System.out.println("Tam: "+eventos.size());
        eventoactual = eventos.remove(0);
        System.out.println("evento: "+eventoactual.gett1());
          */
        
        while(!eventos.isEmpty()){
            eventoactual=eventos.remove(0);
            if(eventoactual.getentrada()){
                if(cola1.isEmpty()){
                    eventoactual.sett3(eventoactual.gett2());
                    eventoactual.setcola(1);
                    cola1.add(eventoactual);
                    gente[0].setFila(1);
                    gente[0].setPersonas(gente[0].getPersonas()+1);
                    tiempos[0]=eventoactual.gett3();
                    System.out.println("Entro alguien a la cola 1 en el tiempo "+ eventoactual.gett1());
                }else{
                    if(cola2.isEmpty()){
                        eventoactual.sett3(eventoactual.gett2());
                        eventoactual.setcola(2);
                        cola2.add(eventoactual);
                        gente[1].setFila(2);
                        gente[1].setPersonas(gente[1].getPersonas()+1);
                        tiempos[1]=eventoactual.gett3();
                        System.out.println("Entro alguien a la cola 2 en el tiempo "+ eventoactual.gett1());
                    }else{
                        if(cola3.isEmpty()){
                            eventoactual.sett3(eventoactual.gett2());
                            eventoactual.setcola(3);
                            cola3.add(eventoactual);
                            gente[2].setFila(3);
                            gente[2].setPersonas(gente[2].getPersonas()+1);
                            tiempos[2]=eventoactual.gett3();
                            System.out.println("Entro alguien a la cola 3 en el tiempo "+ eventoactual.gett1());
                        }else{
                            if(cola4.isEmpty()){
                                eventoactual.sett3(eventoactual.gett2());
                                eventoactual.setcola(4);
                                cola4.add(eventoactual);
                                gente[3].setFila(4);
                                gente[3].setPersonas(gente[3].getPersonas()+1);
                                tiempos[3]=eventoactual.gett3();
                                System.out.println("Entro alguien a la cola 4 en el tiempo "+ eventoactual.gett1());
                            }
                            else{
                                for(int x=0; x<3; x++){
                                    for(int y=0; y<3; y++){
                                        Fila temporal;
                                        if(gente[y].getPersonas()>gente[y+1].getPersonas()){
                                            temporal=gente[y];
                                            gente[y]=gente[y+1];
                                            gente[y+1]=temporal;
                                        }
                                    }
                                    
                                }
                                int menor=gente[0].getFila();
                                for(int x=0; x<4; x++){
                                    Fila temporal;
                                    for(int y=0; y<4; y++){
                                        
                                        if((x+1)==gente[y].getFila()){
                                            temporal=gente[x];
                                            gente[x]=gente[y];
                                            gente[y]=temporal;
                                        }
                                    }
                                   
                                }
                                switch (menor){
                                    case 1:
                                        if(cola1.size()<=10){
                                        tiempos[0]=tiempos[0]+cola1.peek().gett1()-eventoactual.gett1()+eventoactual.gett2();
                                        eventoactual.sett3(tiempos[0]);
                                        gente[0].setPersonas(gente[0].getPersonas()+1);
                                        eventoactual.setcola(1);
                                        cola1.add(eventoactual);
                                        System.out.println("Entro alguien a la cola 1 en el tiempo "+ eventoactual.gett1());

                                        }
                                    break;
                                    case 2:
                                        if(cola2.size()<=10){
                                        tiempos[1]=tiempos[1]+cola2.peek().gett1()-eventoactual.gett1()+eventoactual.gett2();
                                        eventoactual.sett3(tiempos[1]);
                                        eventoactual.setcola(2);
                                        cola2.add(eventoactual);
                                        System.out.println("Entro alguien a la cola 2 en el tiempo "+ eventoactual.gett1());
                                        gente[1].setPersonas(gente[1].getPersonas()+1);
                                        }
                                    break;
                                    case 3:
                                        if(cola3.size()<=10){
                                        tiempos[2]=tiempos[2]+cola2.peek().gett1()-eventoactual.gett1()+eventoactual.gett2();
                                        eventoactual.sett3(tiempos[2]);
                                        eventoactual.setcola(3);
                                        cola3.add(eventoactual);
                                        gente[2].setPersonas(gente[2].getPersonas()+1);
                                        System.out.println("Entro alguien a la cola 3 en el tiempo "+ eventoactual.gett1());
                                        }
                                    break;
                                    case 4:
                                        if(cola4.size()<=10){
                                        tiempos[3]=tiempos[3]+cola2.peek().gett1()-eventoactual.gett1()+eventoactual.gett2();
                                        eventoactual.sett3(tiempos[3]);
                                        eventoactual.setcola(4);
                                        cola4.add(eventoactual);
                                        gente[3].setPersonas(gente[3].getPersonas()+1);
                                        System.out.println("Entro alguien a la cola 4 en el tiempo "+ eventoactual.gett1());
                                        }
                                    break;
                                }
                           
                                

                              
                                
                            }
                        }
                    }
                }
                
                int y=0;
                int size=eventos.size();
                encontrado=false;
                int numero=0;
                for(int i=0; i<size && !encontrado; i++){
                    if(eventos.get(i).getentrada()){
                        if(eventos.get(i).gett1()>(eventoactual.gett1()+eventoactual.gett3())){
                            encontrado=true;
                        }
                    }
                    else{
                         if((eventos.get(i).gett1()+eventos.get(i).gett3())>(eventoactual.gett1()+eventoactual.gett3())){
                            encontrado=true;
                        }
                    }
                    if(encontrado){
                        numero=i;
                    }else
                    {
                        numero=size;
                    }
                }
                
                /*
                while((y<eventos.size())&&(eventos.get(y).gett1()<(eventoactual.gett1()+eventoactual.gett3()))){
                    
                        y++;
                }
                //eventoactual.sett1(eventoactual.gett1()+eventoactual.gett3());
                 
                 */
                
                eventoactual.setentrada(false);
                eventos.add(numero, eventoactual);
                promedio+=eventoactual.gett3();
                 
                 
            }else{
                if(eventoactual.gett3()<0){
                    eventoactual.sett3((-1*eventoactual.gett3()));
                }
                switch(eventoactual.getcola()){
                    case 1:
                        System.out.println("Salio alguien de la ventanilla 1 en el tiempo "+ (eventoactual.gett1()+eventoactual.gett3())+ " y se tardo "+ eventoactual.gett3()+" minutos");
                        cola1.remove(0);
                    break;
                    case 2:
                        System.out.println("Salio alguien de la ventanilla 2 en el tiempo "+ (eventoactual.gett1()+eventoactual.gett3())+" y se tardo "+ eventoactual.gett3()+" minutos");
                        cola2.remove(0);
                    break;
                    case 3:
                        System.out.println("Salio alguien de la ventanilla 3 en el tiempo "+ (eventoactual.gett1()+eventoactual.gett3())+ " y se tardo "+ eventoactual.gett3()+" minutos");
                        cola3.remove(0);
                    break;
                    case 4:
                        System.out.println("Salio alguien de la ventanilla 4 en el tiempo "+ (eventoactual.gett1()+eventoactual.gett3())+ " y se tardo "+ eventoactual.gett3()+" minutos");
                        cola4.remove(0);
                    break;    
                }
            }
        }
        System.out.println("El promedio de tiempo por cliente es: "+(promedio/num)+  " minutos");
    }
}
